package com.atguigu.chap01;

/**
 * 资源类：封装卖票的方法，由多个线程来调用
 */
class Ticket{
    private int number=2000; // 票数

    /**
     * 卖票方法
     * 票数不能小于零
     * synchronized：同步锁（串行化） 排他锁 互斥锁 独占锁
     */
    public synchronized void sale(){
        if (number<=0){
            System.out.println("已卖完");
            return;
        }
        try {
            System.out.println(Thread.currentThread().getName()+"卖出了第"+number+"张票");
            number--; //++ -- 不是线程安全的
            Thread.sleep(10);
            System.out.println(Thread.currentThread().getName()+"剩余"+number+"张票");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

/**
 * 卖票程序：
 * 多线程代码模版（上）
 *      高内聚，低耦合
 *      线程操作资源类
 */
public class TicketDemo {
    public static void main(String[] args) {
        //创建对象
        Ticket ticket = new Ticket();
        //模拟卖票窗口
        new Thread(() -> {
            for (int i = 0; i <2000 ; i++) {
                ticket.sale();
            }
        }, "A").start();
        new Thread(()->{
            for (int i = 0; i <2000; i++) {
                ticket.sale();
            }
        },"B").start();
    }
}
